<?php

App::import('Sanitize');

class DepartamentosController extends AppController {

    var $name = 'Departamentos';
    var $paginate = array(
        'order' => array('Departamento.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        //parent::beforeFilter();
    }

    function index($provincia_id = null, $departamento_id = null) {
        $this->__aux_index($provincia_id, $departamento_id);
    }

    function admin_index($provincia_id = null, $departamento_id = null) {
        $this->__aux_index($provincia_id, $departamento_id);
    }

    function __aux_index($provincia_id = null, $departamento_id = null) {
        $this->Departamento->recursive = 0;
        $this->paginate['order'] = array('Provincia.nombre', 'Departamento.nombre');

        $provincias = $this->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));
        $provincias['0'] = 'Todas';
        $provincia_id = (!empty($provincia_id)) ? $provincia_id : null;
        
        $lista_departamentos = array();
        $condiciones = array();
        $nombre = '';

        if (!empty($provincia_id)) {
            $this->data['Departamento']['provincia_id'] = $provincia_id;
            $lista_departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id),
                                'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
            $lista_departamentos[0] = 'Todos';
            $departamento_id = (!empty($departamento_id)) ? $departamento_id : '0';
        }

        if (!empty ($departamento_id)){
          $this->data['Departamento']['departamento_id'] =  $departamento_id;
        }
              
        //si vienen datos del filtro
        if (!empty($this->data)) {

            if (isset($this->data['Departamento']['provincia_id']) && !empty($this->data['Departamento']['provincia_id'])) {
                $condiciones[] = "Departamento.provincia_id = {$this->data['Departamento']['provincia_id']}";
            }

            if (isset($this->data['Departamento']['provincia_id']) && (!empty($this->data['Departamento']['provincia_id']) || ($this->data['Departamento']['provincia_id'] == '0'))) {
                $provincia_id = $this->data['Departamento']['provincia_id'];
                $this->Session->write('provincia_id', $provincia_id);
            }

            if (isset($this->data['Departamento']['departamento_id']) && !empty($this->data['Departamento']['departamento_id'])) {
                $condiciones[] = "Departamento.id = {$this->data['Departamento']['departamento_id']}";
            }

            if ((isset($this->data['Departamento']['departamento_id'])) && (!empty($this->data['Departamento']['departamento_id']) || ($this->data['Departamento']['departamento_id'] == '0'))) {
                $departamento_id = $this->data['Departamento']['departamento_id'];
                if (!empty($this->data['Departamento']['provincia_id'])) {
                    $lista_departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $this->data['Departamento']['provincia_id']),
                                'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
                } else {
                    $lista_departamentos = $this->Departamento->find('list', array('fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
                }
                $lista_departamentos[0] = 'Todos';
                $this->Session->write('departamento_id', $departamento_id);
                $this->Session->write('lista_departamentos', $lista_departamentos);
            }

            if (isset($this->data['Departamento']['nombre']) && !empty($this->data['Departamento']['nombre'])) {
                $departamento = utf8_encode(strtolower(utf8_decode(trim($this->data['Departamento']['nombre']))));
                $condiciones[] = "lower(Departamento.nombre) LIKE '%{$departamento}%'";
                $nombre = $this->data['Departamento']['nombre'];
                $this->Session->write('nombre', $nombre);
            }

            $this->Session->write('departamentos_filter', $condiciones);
        } elseif ($this->Session->check('departamentos_filter')) {//si tengo cargado un filtro en session
            //me fijo si esta cambiando de pagina o cambiando el limit
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                //si ya estaba siendo aplicado un filtro, lo sigo usando
                $condiciones = $this->Session->read('departamentos_filter');
                $provincia_id = ($this->Session->check('provincia_id')) ? $this->Session->read('provincia_id') : '';
                $departamento_id = ($this->Session->check('departamento_id')) ? $this->Session->read('departamento_id') : '';
                $lista_departamentos = ($this->Session->check('lista_departamentos')) ? $this->Session->read('lista_departamentos') : array();
                $nombre = ($this->Session->check('nombre')) ? $this->Session->read('nombre') : '';
            } else {
                //sino, lo borro de la session
                $this->Session->delete('departamentos_filter');
                $this->Session->delete('provincia_id');
                $this->Session->delete('departamento_id');
                $this->Session->delete('lista_departamentos');
                $this->Session->delete('nombre');
            }
        }

        $this->paginate['conditions'] = $condiciones;
        $referer = $this->referer();
        $this->set(compact('provincias', 'provincia_id', 'departamento_id', 'lista_departamentos', 'nombre', 'referer'));
        $this->set('departamentos', $this->paginate());
        $this->render('index');
    }

    function delete($id = null) {
        $this->__aux_delete($id);
    }

    function admin_delete($id = null) {
        $this->__aux_delete($id);
    }

    /**
     * Permite eliminar un departamento seleccionado si no existen localidades que pertenecen a ese departamento
     * @param <type> $id
     */
    function __aux_delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Departamento inválido', true), 'flash_failure');
        } else {
            // Chequeo que el departamento exista
            $departamento = $this->Departamento->find('all', array('conditions' => array('Departamento.id' => $id)));
            if (!empty($departamento)) {
                $departamento_name = $departamento[0]['Departamento']['nombre'];
                // Chequeo si hay localidades que pertenecen a esa departamento
                $localidades = $this->Localidade->find('all', array('conditions' => array('Localidade.departamento_id' => $id)));
                if (!empty($localidades)) {
                    $this->Session->setFlash(__('El departamento "' . $departamento_name . '" no se puede eliminar porque existen localidades que pertenecen a dicho departamento.', true), 'flash_failure');
                } else {
                    if ($this->Departamento->delete($id)) {
                        $this->Session->setFlash(__('El departamento "' . $departamento_name . '" se eliminó correctamente.', true), 'flash_success');
                    } else {
                        $this->Session->setFlash(__('El departamento no se pudo eliminar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                }
            } else {
                $this->Session->setFlash(__('Departamento inválido', true), 'flash_failure');
            }
        }
        $this->redirect(array('action' => 'admin_index'));
    }

    function add($provincia_id = null) {
        $this->__aux_add($provincia_id);
    }

    function admin_add($provincia_id = null) {
        $this->__aux_add($provincia_id);
    }

    /**
     * Permite dar de alta un nuevo departamento
     */
    function __aux_add($provincia_id = null) {

        if (!empty($this->data)) {
            $departamento_name = utf8_encode(strtolower(utf8_decode(trim($this->data['Departamento']['nombre']))));
            $provincia_id = trim($this->data['Departamento']['provincia_id']);

            if (!empty($departamento_name)) {
                // Chequeo si existe en la db un departamento con el mismo nombre y que pertenezca a la misma provincia
                $departamento = $this->Departamento->find('all', array('conditions' => array('lower(Departamento.nombre)' => $departamento_name, 'Departamento.provincia_id' => $provincia_id)));
                if (empty($departamento)) {
                    $this->Departamento->create();
                    if ($this->Departamento->save($this->data)) {
                        $departamento_id = $this->Departamento->id;
                        $this->Session->setFlash(__('El departamento se guardó correctamente.', true), 'flash_success');
                        $this->redirect(array('action' => 'admin_index', $provincia_id, $departamento_id));
                    } else {
                        $this->Session->setFlash(__('El departamento no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                } else {
                    $provincia = $this->Departamento->Provincia->find('all', array('conditions' => array('Provincia.id' => $provincia_id)));
                    $provincia_name = $provincia[0]['Provincia']['nombre'];
                    $this->Session->setFlash(__('El departamento "' . $this->data['Departamento']['nombre'] . '" de la provincia de "' . $provincia_name . '" ya existe.', true), 'flash_failure');
                }
            } else {
                $this->Session->setFlash(__('El nombre del departamento no puede ser vacio. Por favor, intente nuevamente.', true), 'flash_failure');
            }
        }
        $provincias = $this->Departamento->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));

        $referer = $this->referer();
        $this->set(compact('provincias', 'provincia_id', 'referer'));
        $this->render('add');
    }

    function edit($id = null) {
        $this->__aux_edit($id);
    }

    function admin_edit($id = null) {
        $this->__aux_edit($id);
    }

    /**
     * Permite editar un departamento existente
     */
    function __aux_edit($id = null) {
        $provincia_id = 0;
        if (empty($id) && empty($this->data)) {
            $this->Session->setFlash(__('Departamento inválido', true), 'flash_failure');
            $this->redirect(array('action' => 'admin_add'));
        } elseif (empty($this->data)) {
            $this->data = $this->Departamento->read(null, $id);
            $provincia_id = $this->data['Departamento']['provincia_id'];
        } elseif (!empty($this->data)) {
            $departamento_name = utf8_encode(strtolower(utf8_decode(trim($this->data['Departamento']['nombre']))));
            $provincia_id = trim($this->data['Departamento']['provincia_id']);

            // Chequeo si existe en la db un departamento con el mismo nombre y que pertenezca a la misma provincia
            $departamento = $this->Departamento->find('all', array('conditions' => array("Departamento.id <>" => $id, 'lower(Departamento.nombre)' => $departamento_name, 'Departamento.provincia_id' => $provincia_id)));
            if (empty($departamento)) {
                if ($this->Departamento->save($this->data)) {
                    $this->Session->setFlash(__('El departamento se guardó correctamente.', true), 'flash_success');
                    $this->redirect(array('action' => 'admin_index', $provincia_id, $id));
                } else {
                    $this->Session->setFlash(__('El departamento no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                }
            } else {
                $provincia = $this->Departamento->Provincia->find('all', array('conditions' => array('Provincia.id' => $provincia_id)));
                $provincia_name = $provincia[0]['Provincia']['nombre'];
                $this->Session->setFlash(__('El departamento "' . $this->data['Departamento']['nombre'] . '" de la provincia de "' . $provincia_name . '" ya existe.', true), 'flash_failure');
            }
        }
        $provincias = $this->Departamento->Provincia->find('list', array('fields' => array('Provincia.id', 'Provincia.nombre'), 'order' => 'Provincia.nombre'));
        $referer = $this->referer();
        $this->set(compact('provincias', 'provincia_id', 'referer'));
        $this->render('edit');
    }

    function view_departamentos_filtro($provincia_id = null) {
        $this->__aux_view_departamentos_filtro($provincia_id);
    }

    function admin_view_departamentos_filtro($provincia_id = null) {
        $this->__aux_view_departamentos_filtro($provincia_id);
    }

    /**
     * Busca los departamentos de una determinada provincia o todos los departamentos
     * @param <type> $provincia_id
     */
    function __aux_view_departamentos_filtro($provincia_id = null) {
        $this->layout = false;
        $departamentos = array();
        if (!empty($provincia_id)) {
            $departamentos = $this->Departamento->find('list', array('conditions' => array('Departamento.provincia_id' => $provincia_id),
                        'fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        } else {
            $departamentos = $this->Departamento->find('list', array('fields' => array('Departamento.id', 'Departamento.nombre'), 'order' => 'Departamento.nombre'));
        }
        $departamentos[0] = 'Todos';
        $this->set(compact('departamentos'));
        $this->render('view_departamentos_filtro');
    }

}
?>